package 热题100.滑动窗口.找到字符串中所有字母异位词_438;

import java.util.ArrayList;
import java.util.List;

/*
给定两个字符串 s 和 p，找到 s 中所有 p 的 异位词 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串（包括相同的字符串）。

示例 1:
输入: s = "cbaebabacd", p = "abc"
输出: [0,6]
解释:
起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

示例 2:
输入: s = "abab", p = "ab"
输出: [0,1,2]
解释:
起始索引等于 0 的子串是 "ab", 它是 "ab" 的异位词。
起始索引等于 1 的子串是 "ba", 它是 "ab" 的异位词。
起始索引等于 2 的子串是 "ab", 它是 "ab" 的异位词。

思路：
     根据子串很容易想到滑动窗口，即双指针的区间版，一个固定遍历的指针，一个满足条件的右指针，判断区间内的值是否满足条件，满足则添加进去就行

* */
public class Solution {
    public static void main(String[] args) {
        String s = "cbaebabacd", p = "abc";
        List<Integer> ans = findAnagrams(s, p);
        for (int t : ans){
            System.out.println(t);
        }
    }
    public static List<Integer> findAnagrams(String s, String p) {
        List<Integer> ans = new ArrayList<>();
        char[] strs = s.toCharArray();
        if (s.length() < p.length()){
            return ans;
        }
        int right = p.length() - 1;
        for (int i = 0; i < s.length(); i ++){
            if (right < s.length()){
                if (isReverse(strs, i, right, p)){
                    ans.add(i);
                }
                right ++;
            } else {
                break;
            }
        }
        return ans;
    }

    public static boolean isReverse(char[] strs, int left, int right, String p){
        int[] nums = new int[26];
        for (int i = left; i <= right; i ++){
            nums[strs[i] - 'a'] ++;
        }
        for (int i = 0; i < p.length(); i ++){
            nums[p.charAt(i) - 'a'] --;
        }
        for (int i = 0; i < nums.length; i ++){
            if (nums[i] != 0){
                return false;
            }
        }
        return true;
    }
}
